﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Data;

namespace Workflow.Common.Tools
{
	public class ToolsHelper
	{
		/// <summary>
		/// 时区转换
		/// </summary>
		/// <param name="from"></param>
		/// <returns></returns>
		public static DateTime GetTimeZoneNow()
		{
			DateTime from = DateTime.Now;

			var time = int.Parse(ConfigurationManager.AppSettings["TimeZone"]);

			return from.AddHours(time);
		}

		/// <summary>
		/// 将泛型集合类转换成DataTable
		/// </summary>
		/// <typeparam name="T">集合项类型</typeparam>
		/// <param name="list">集合</param>
		/// <returns>数据集(表)</returns>
		public static DataTable ToDataTable<T>(IList<T> list)
		{
			return ToDataTable<T>(list, null);
		}

		/// <summary>
		/// 将泛型集合类转换成DataTable
		/// </summary>
		/// <typeparam name="T">集合项类型</typeparam>
		/// <param name="list">集合</param>
		/// <param name="propertyName">需要返回的列的列名</param>
		/// <returns>数据集(表)</returns>
		public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
		{
			List<string> propertyNameList = new List<string>();
			if (propertyName != null)
				propertyNameList.AddRange(propertyName);

			DataTable result = new DataTable();
			if (list.Count > 0)
			{
				PropertyInfo[] propertys = list[0].GetType().GetProperties();
				foreach (PropertyInfo pi in propertys)
				{
					if (propertyNameList.Count == 0)
					{
						result.Columns.Add(pi.Name, pi.PropertyType);
					}
					else
					{
						if (propertyNameList.Contains(pi.Name))
							result.Columns.Add(pi.Name, pi.PropertyType);
					}
				}

				for (int i = 0; i < list.Count; i++)
				{
					ArrayList tempList = new ArrayList();
					foreach (PropertyInfo pi in propertys)
					{
						if (propertyNameList.Count == 0)
						{
							object obj = pi.GetValue(list[i], null);
							tempList.Add(obj);
						}
						else
						{
							if (propertyNameList.Contains(pi.Name))
							{
								object obj = pi.GetValue(list[i], null);
								tempList.Add(obj);
							}
						}
					}
					object[] array = tempList.ToArray();
					result.LoadDataRow(array, true);
				}
			}
			return result;
		}
	}
}
